package com.gaocf.designpatterns.create.prototype;

import java.util.ArrayList;
import java.util.List;

/**
 * 原型设计模式 java.lang.Object => clone方法
 * 其实就是复制该对象实例
 *
 * Java的所有类都是从java.lang.Object类继承而来的，而Object类提供protected Object clone()方法对对象进行复制，
 * 子类当然也可以把这个方法置换掉，提供满足自己需要的复制方法。
 * 对象的复制有一个基本问题，就是对象通常都有对其他的对象的引用。
 * 当使用Object类的clone()方法来复制一个对象时，此对象对其他对象的引用也同时会被复制一份
 *
 * Java语言提供的Cloneable接口只起一个作用，就是在运行时期通知Java虚拟机可以安全地在这个类上使用clone()方法。
 * 通过调用这个clone()方法可以得到一个对象的复制。
 * 由于Object类本身并不实现Cloneable接口，因此如果所考虑的类没有实现Cloneable接口时，调用clone()方法会抛出CloneNotSupportedException异常。
 */
public class Main implements Cloneable {
    public String name;

    public List<String> names;

    public static void main(String[] args) throws CloneNotSupportedException {

        System.out.println("装饰者设计模式...");

        Main m = new Main();
        m.name = "gaocf";
        m.names = new ArrayList<>();
        m.names.add("高晨峰");
        Main mClone = (Main) m.clone();
        m.name = "高晨峰";
        m.names.add("gaocf");

        System.out.println(m);
        System.out.println(mClone);

        System.out.println(mClone.name);
        System.out.println(mClone.names);

    }
}
